\subsection{Annulation}

\paragraph{Présentation}
L'annulation est le mécanisme par lequel un \textit{thread} peut interrompre l'exécution d'un autre \textit{thread}. C'est l'équivalent pour les \textit{threads} de la fonction \texttt{kill()} des processus classiques. Plus précisément, un \textit{thread} peut envoyer une requête d'annulation à un autre \textit{thread}. 

\paragraph{Implémentation}
Nous avons rajouté deux booléens dans la structure \textsf{thread} : \texttt{canceling} pour signaler qu'un \textit{thread} est en cours d'abandon et \texttt{canceled} pour signaler qu'un \textit{thread} est abandonné. Avant de faire un \texttt{thread\_{}join()}, on teste si le \textit{thread} est annulé ou pas, si oui, on sort et on renvoie \textsf{PTHREAD\_{}CANCELED}. On a créé une fonction \texttt{thread\_{}cancel()} qui prend en paramètre le \textit{thread} à annuler. Le principe est le suivant : on arrête le \textit{timer} pour éviter la préemption, on teste si le \textit{thread} a reçu une demande d'annulation. Si ce n'est pas le cas, on relance le \textit{timer}. On l'ajoute à la liste des \textit{threads} morts et on le retire de la liste des \textit{threads} à exécuter. Enfin, on relance le \textit{timer} pour relancer la préemption.

\paragraph{Tests}
Pour tester l'annulation, on crée un \textit{thread}, on fait un \textsf{thread\_{}yield()}, on annule le \textit{thread} créé et enfin on vérifie que \texttt{thread\_{}join()} sur le \textit{thread} annulé n'est pas possible et qu'il retourne \textsf{PTHREAD\_{}CANCELED}.
